import axios from "axios";
import {ElMessage} from "element-plus";

let axiosInstance = axios.create({
    timeout: 10000,
    baseURL: "http://localhost:8080" // 情况 1：后端使用 CORS 解决跨域；前端仍然基于 Vite 服务器运行
    // baseURL: "/" // 情况 2：前端打包部署到后端工程内，没有跨域问题
});

// 编写 Axios 拦截器
// 1、请求相关
// 当前项目功能需求中，用不到请求拦截器，所以可以不写
// axiosInstance.interceptors.request.use(config => config, error => Promise.reject(error));

// 2、响应相关
// use() 参数一：响应状态码 2 开头的情况
// use() 参数二：响应状态码不是 2 开头的情况
axiosInstance.interceptors.response.use(response => {

    // 逻辑错误：业务层面错误，通常都是我们自己自定义的，正好对应 Result 类中的失败的情况
    // 举例：输入用户名、密码执行用户登录，但是用户名或密码错误，登录失败
    // 此时后端没有抛出异常，而是正常通过响应状态码 200 返回了登录失败的逻辑错误
    // 具体体现是：Result 中封装的数据：
    //      code：15683
    //      message：USER_LOGIN_FAILED_ACCOUNT_PWD_INVALID

    // 开发层面：我们需要根据 Result 中的 code 值来判断逻辑上成功还是失败
    // 这里需要项目全局范围内（团队内所有成员参与）约定：code 值 2000 代表逻辑成功
    const resultCode = response.data.code;

    // 逻辑上成功的情况
    if (resultCode == 2000) {

        // 返回 response 对象即可
        return response;
    }

    // 逻辑上失败的情况
    // [1]弹出提示信息
    ElMessage.error(`[逻辑错误]${response.data.message} ${resultCode}`);

    // [2]返回失败状态的 Promise 对象
    // 效果是业务代码中的后续操作都不执行了
    // 业务代码举例：let {data} = await axiosInstance.get("/TigerSer2vletGetAll");
    return Promise.reject(response.data.message);
}, error => {
    // 语法错误：HTTP 层面错误
    ElMessage.error(`[HTTP错误]${error.message} ${error.status}`);

    return Promise.reject(error);
});

export default axiosInstance;